package lv.servidordisqueria.repositorio;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import lv.mensajeriadisqueria.idomain.IUsuario;
import lv.servidordisqueria.domain.Usuario;
import lv.servidordisqueria.excepcion.DomainNoExistenteException;
import lv.servidordisqueria.persistencia.ConeccionBaseDatos;

/**
 * Clase de repositorio de usuario, maneja los mensajes de acceso a la base de datos del
 * usuario.
 */
public class UsuarioRepositorio implements RepositorioJDBC<IUsuario> {

	private static UsuarioRepositorio INSTANCE = null;
	 
	private UsuarioRepositorio() {}
	 
	// creador sincronizado para protegerse de posibles problemas  multi-hilo
	// otra prueba para evitar instanciación múltiple 
	private synchronized static void crearInstance() {
		if (INSTANCE == null) { 
			INSTANCE = new UsuarioRepositorio();
		}
	}

	public static UsuarioRepositorio getInstance() {
		if (INSTANCE == null) 
			crearInstance();
		return INSTANCE;
	}

	@Override
	public List<IUsuario> buscarTodos() throws SQLException, DomainNoExistenteException {
		return buscar("1", "1");
	}

	@Override
	public IUsuario buscarPorId(Integer id) throws SQLException, DomainNoExistenteException {
		return buscar("ID_USUARIO", id).get(0);
	}

	@SuppressWarnings("null")
	@Override
	public List<IUsuario> buscar(String columna, Object valor) throws SQLException, DomainNoExistenteException {
		List<IUsuario> iUsuarios = new ArrayList<IUsuario>();
		if ((columna != null || !columna.isEmpty()) && (valor != null)) {
			Statement st = null;
			try {
				st = ConeccionBaseDatos.getInstance().getConnection().createStatement();
				if (valor instanceof String) {
					valor = "'" + valor + "'";
				}
				String query = ("SELECT * FROM USUARIO WHERE " + columna + " = "+ valor +";");
				ResultSet rs = st.executeQuery(query);
				while (rs.next()) {
					IUsuario iUsuario = new Usuario();
					iUsuario.setIdUsuario(rs.getInt(1));
					iUsuario.setRol(RolRepositorio.getInstance().buscarPorId(rs.getInt(2)));
					iUsuario.setNombre(rs.getString(3));
					iUsuario.setDescripcion(rs.getString(4));
					iUsuario.setClave(rs.getString(5));
					
					if(rs.getString(6).equalsIgnoreCase("S"))
							iUsuario.setHabilitado(true);
						else
							iUsuario.setHabilitado(false);
					iUsuarios.add(iUsuario);
				}
				if(iUsuarios.isEmpty()){
					throw new DomainNoExistenteException();
				}
			} finally {
				if (st != null) {
					st.close();
				}
			}
		}
		return iUsuarios;
	}

	@Override
	public void editar(IUsuario usuario) throws SQLException {
		PreparedStatement st = null;
		try {
			String query = "UPDATE USUARIO SET DESCRIPCION = '" + usuario.getDescripcion() + 
				"', ID_ROL = "+usuario.getRol().getIdRol() + ", CLAVE = '"+usuario.getClave()+ 
				"' WHERE ID_USUARIO = "+ usuario.getIdUsuario() +";";
			st = ConeccionBaseDatos.getInstance().getConnection().prepareStatement(query);
			st.executeUpdate();
		} finally {
			if (st != null) {
				st.close();
			}
		}
	}

	@Override
	public void borradoFisico(IUsuario usuario) throws SQLException {
		PreparedStatement st = null;
		try {
			String query = "DELETE FROM USUARIO WHERE ID_USUARIO = "
					+ usuario.getIdUsuario()+";";
			st = ConeccionBaseDatos.getInstance().getConnection().prepareStatement(query);
			st.executeUpdate();
		} finally {
			if(st != null){
				st.close();
			}
		}
	}

	@Override
	public void borrar(IUsuario entity) throws SQLException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public IUsuario insertar(IUsuario usuario) throws SQLException, DomainNoExistenteException {
		IUsuario usuarioGuardado = usuario;
		PreparedStatement st = null;
		try {
			String query = "INSERT INTO USUARIO (ID_ROL, NOMBRE, DESCRIPCION, CLAVE) VALUES ("+
					+ usuario.getRol().getIdRol() + ",'" + usuario.getNombre() +"','" 
					+ usuario.getDescripcion() + "','" + usuario.getClave()+"');";
			st = ConeccionBaseDatos.getInstance().getConnection().prepareStatement(query);
			st.executeUpdate();
			usuarioGuardado = buscar("NOMBRE", usuario.getNombre()).get(0);
		} finally {
			if(st != null){
				st.close();
			}
		}
		return usuarioGuardado;
	}
}
